package com.strategy;

/*
 * 策略模式（Strategy） 如同LayoutManager和具体的布局管理器的关系.
 * 在抽象策略类中定义方法，将易于变化的部分封装为接口，通常Strategy 封装一些运算法则，使之能互换。
 * 策略模式其实是一种“面向接口”的编程方法。
 * 在具体策略子类中实现，客户代码根据不同的需要选择相应的具体类，
 * 例如电子商务中多种价格算法。 一种策略一旦选中，整个系统运行期是不变化的.
 */
public class TestStrategy {

	public static void main(String[] args) {
		Strategy s1 = new May1Strategy();

		Strategy s2 = new June1Strategy();

		Book b = new Book(100);
		
		b.setS(s1);
		
		System.out.println(b.getPrice());
		
		b.setS(s2);

		System.out.println(b.getPrice());

	}

}

class Book {

	Strategy s;

	public Book(double price) {

		this.price = price;

	}

	private double price;

	public void setS(Strategy s) {

		this.s = s;

	}

	public double getPrice() {

		return price * s.getZheKou();

	}

}

interface Strategy {

	double getZheKou();

}

class May1Strategy implements Strategy {

	public double getZheKou() {

		return 0.8;

	}

}

class June1Strategy implements Strategy {

	public double getZheKou() {

		return 0.7;

	}

}
